/************************************************************************/
/* Game                                                                 */
/************************************************************************/
#include "Game/Factories/AnimationSetFactory.h"

namespace TD_Game {

	AnimationSet * AnimationSetFactory::createMarioAnimationSet(const marioTypes &animType, const string &initialAnimation) {
		switch(animType) {
			
			/************************************************************************/
			/* NES                                                                  */
			/************************************************************************/
			//Super Mario 1
			case NES_Small_Mario_SPM1:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario1AS.xml","Game Objects/Marios/NES/superMario1Sprites.png",0);
			break;

			case NES_Big_Mario_SPM1:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario1AS.xml","Game Objects/Marios/NES/superMario1Sprites.png",1);
			break;
			
			case NES_Fire_Mario_SPM1:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario1AS.xml","Game Objects/Marios/NES/superMario1Sprites.png",2);
			break;
			
			//Super Mario 2
			case NES_Small_Mario_SPM2:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario2AS.xml","Game Objects/Marios/NES/superMario2Sprites.png",0);
			break;

			case NES_Big_Mario_SPM2:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario2AS.xml","Game Objects/Marios/NES/superMario2Sprites.png",1);
			break;

			case NES_Nabo_Mario_SPM2:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario2AS.xml","Game Objects/Marios/NES/superMario2Sprites.png",2);
			break;

			//Super Mario 3
			case NES_Small_Mario_SPM3:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario3AS.xml","Game Objects/Marios/NES/superMario3Sprites.png",0);
				break;

			case NES_Big_Mario_SPM3:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario3AS.xml","Game Objects/Marios/NES/superMario3Sprites.png",1);
				break;

			case NES_Rolling_Mario_SPM3:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario3AS.xml","Game Objects/Marios/NES/superMario3Sprites.png",2);
				break;

			case NES_Tail_Mario_SPM3:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario3AS.xml","Game Objects/Marios/NES/superMario3Sprites.png",3);
				break;

			case NES_Fire_Mario_SPM3:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario3AS.xml","Game Objects/Marios/NES/superMario3Sprites.png",4);

				break;

			case NES_Fox_Mario_SPM3:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario3AS.xml","Game Objects/Marios/NES/superMario3Sprites.png",5);

				break;

			case NES_Frog_Mario_SPM3:
				return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario3AS.xml","Game Objects/Marios/NES/superMario3Sprites.png",6);
			break;

			case NES_Shell_Mario_SPM3:
				return new StandardAnimationSet(initialAnimation,"Animations/Marios/NESMario3AS.xml","Game Objects/Marios/NES/superMario3Sprites.png",7);
			break;


         case SNES_Small_Mario:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",0);

            break;

         case SNES_Big_Mario:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",1);

            break;

         case SNES_Big_Mario_Running:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",2);

            break;

         case SNES_Hammer_Mario:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",3);

            break;

         case SNES_Flower_Mario:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",4);

            break;

         case SNES_Flying_Mario1:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",5);

            break;

         case SNES_Flying_Mario2:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",6);
     
            break;

         case SNES_Flying_Mario3:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",7);

            break;

         case SNES_Big_Mario_Doc:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",8);

            break;

         case SNES_Big_Mario_Running_Doc:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",9);

            break;

         case SNES_Flying_Mario_Doc:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",10);

            break;

         case SNES_Flying_Mario_Doc2:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",11);

            break;

         case SNES_Flying_Mario_Doc3:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/SNES.xml","Game Objects/Marios/SNES/snesSuperMarioSprites.png",12);

            break;


			case Mario_MarioRPGAS:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/MarioRPGAS.xml","Game Objects/Marios/SNES/marioRPGSprites.png",0);
            break;




         case SNES_Luigi:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",0);
            break;
         case SNES_Luigi_Running:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",1);
            break;
         case SNES_Peach:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",2);
            break;
         case SNES_Peach_Running:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",3);
            break;
         case SNES_Princess:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",4);
            break;
         case SNES_Princess_Running:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",5);
            break;
         case NES_Small_Luigi:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",6);
            break;
         case NES_Luigi:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",7);
            break;
         case NES2_Luigi:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",8);
            break;
         case NES2_Toad:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",9);
            break;
         case NES2_Peach:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",10);
            break;
         case NES3_Small_Luigi:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",11);
            break;
         case NES3_Luigi:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",12);
            break;
         case NES3_Luigi_Running:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",13);
            break;
         case NES3_Tail_Luigi:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",14);
            break;
         case NES3_Tail_Luigi_Running:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bonus.xml","Game Objects/Marios/bonusSprites.png",15);
            break;
         case Megaman:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/megaman.xml","Game Objects/Marios/megamanSprites.png",0);
            break;
         case Cutman:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/cutproto.xml","Game Objects/Marios/cutandprotoSprites.png",0);
            break;
         case Protoman:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/cutproto.xml","Game Objects/Marios/cutandprotoSprites.png",1);
            break;
         case WhiteBomberman:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bomberman.xml","Game Objects/Marios/bombermanSprites.png",0);
            break;
         case BlackBomberman:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/bomberman.xml","Game Objects/Marios/bombermanSprites.png",1);
            break;
         case Sonic:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/sonic.xml","Game Objects/Marios/sonicSprites.png",0);
            break;
         case Sonic_Rolling:
            return new StandardAnimationSet(initialAnimation,"Animations/Marios/sonic.xml","Game Objects/Marios/sonicSprites.png",1);
            break;
			break;
		}
		return NULL;
	}

	AnimationSet * AnimationSetFactory::createBowserAnimationSet(const bowserTypes &animType, const string & initialAnimation) {
		switch(animType) {
			case Sleeping_Bowser:
				return new StandardAnimationSet(initialAnimation, "Animations/Game Intro/SleepingBowser.xml", "Intro/bowser set.png", 0);
			break;

			case Magikoopa:
				return new StandardAnimationSet(initialAnimation, "Animations/Game Intro/Magikoopa.xml", "Intro/magikoopa.png", 0);
			break;
			
			case Snifit:
				return new StandardAnimationSet(initialAnimation, "Animations/Game Intro/Magikoopa.xml", "Intro/snifit.png", 0);
			break;

			case Shyguy:
				return new StandardAnimationSet(initialAnimation, "Animations/Game Intro/Magikoopa.xml", "Intro/shyguy.png", 0);
			break;

			case Lakitu:
				return new StandardAnimationSet(initialAnimation, "Animations/Game Intro/Magikoopa.xml", "Intro/lakitu.png", 0);
			break;

		}
	}
	AnimationSet * AnimationSetFactory::createShotAnimationSet(const shotTypes & animType, const string &initialAnimation) {
		switch(animType) {
			

			/** Spine shell shot*/
			case spineShell_lvl1:
			case spineShell_lvl2:
			case spineShell_lvl3:
			case spineShell_lvl4:
			case spineShell_lvl5:
			case spineShell_lvl6:
				return new StandardAnimationSet(initialAnimation, "Animations/Towers/Shots/SpineShellAS.xml", "Game Objects/Towers/Shots/lakituShot.png", animType - spineShell_lvl1);
			break;

			/**Magikoopa shot*/
			case magikoopaShot_lvl1:
			case magikoopaShot_lvl2:
			case magikoopaShot_lvl3:
			case magikoopaShot_lvl4:
			case magikoopaShot_lvl5:
			case magikoopaShot_lvl6:
				return new StandardAnimationSet(initialAnimation, "Animations/Towers/Shots/MagikoopaAS.xml", "Game Objects/Towers/Shots/magikoopaShot.png",animType - magikoopaShot_lvl1);
			break;
	
			/** Pellet shot*/
			case pelletShot_lvl1:
			case pelletShot_lvl2:
			case pelletShot_lvl3:
			case pelletShot_lvl4:
			case pelletShot_lvl5:
			case pelletShot_lvl6:
				return new StandardAnimationSet(initialAnimation, "Animations/Towers/Shots/PelletShotAS.xml", "Game Objects/Towers/Shots/pelletShot.png",animType - pelletShot_lvl1);
			break;

			/** Ice shot*/
			case iceShot_lvl1:
			case iceShot_lvl2:
			case iceShot_lvl3:
			case iceShot_lvl4:
			case iceShot_lvl5:
			case iceShot_lvl6:
				return new StandardAnimationSet(initialAnimation, "Animations/Towers/Shots/IceShotAS.xml", "Game Objects/Towers/Shots/IceShot.png", animType - iceShot_lvl1);
			break;

			
			case fireShot_lvl1:
			case fireShot_lvl2:
			case fireShot_lvl3:
			case fireShot_lvl4:
			case fireShot_lvl5:
			case fireShot_lvl6:
				return new StandardAnimationSet(initialAnimation, "Animations/Towers/Shots/FireShotAS.xml", "Game Objects/Towers/Shots/FireShot.png", animType - fireShot_lvl1);
			break;
		}
		return NULL;
	}

	AnimationSet * AnimationSetFactory::createTowerAnimationSet(const towerTypes & animType, const string &initialAnimation) {
		switch(animType) {


			case insertTower:
				return new StandardAnimationSet(initialAnimation, "Animations/Towers/InsertTowerAS.xml", "Game Objects/Towers/insertTower.png", 0);
			break;
			
			case insertInvalidTower:
				return new StandardAnimationSet(initialAnimation, "Animations/Towers/InsertTowerAS.xml", "Game Objects/Towers/insertInvalidTower.png", 0);
			break;

			
			/** Magikoopa tower: */
			case magikoopaTower_lvl1:
         case magikoopaTower_lvl2:
         case magikoopaTower_lvl3:
         case magikoopaTower_lvl4:
         case magikoopaTower_lvl5:
         case magikoopaTower_lvl6:
            return new StandardAnimationSet(initialAnimation,"Animations/Towers/MagikoopaTowerAS.xml","Game Objects/Towers/magikoopatower.png",animType - magikoopaTower_lvl1);
			break;


         /** Snifit tower */

			case snifitTower_lvl1:
         case snifitTower_lvl2:
         case snifitTower_lvl3:
         case snifitTower_lvl4:
         case snifitTower_lvl5:
         case snifitTower_lvl6:
            return new StandardAnimationSet(initialAnimation,"Animations/Towers/SnifitTowerAS.xml","Game Objects/Towers/snifit tower.png",animType - snifitTower_lvl1);
				
			break;


			/** Flower tower: */
			case flowerTower_lvl1:
         case flowerTower_lvl2:
         case flowerTower_lvl3:
         case flowerTower_lvl4:
         case flowerTower_lvl5:
         case flowerTower_lvl6:
            return new StandardAnimationSet(initialAnimation,"Animations/Towers/FlowerTowerAS.xml","Game Objects/Towers/flowertower.png",animType - flowerTower_lvl1);
		
				break;


			/** Shyguy tower: */
			case shyguyTower_lvl1:
         case shyguyTower_lvl2:
         case shyguyTower_lvl3:
         case shyguyTower_lvl4:
         case shyguyTower_lvl5:
         case shyguyTower_lvl6:
            return new StandardAnimationSet(initialAnimation,"Animations/Towers/ShyguyTowerAS.xml","Game Objects/Towers/shyguyTower.png",animType - shyguyTower_lvl1);
				
			break;

			/** Lakitu tower: */

			case lakituTower_lvl1:
         case lakituTower_lvl2:
         case lakituTower_lvl3:
         case lakituTower_lvl4:
         case lakituTower_lvl5:
         case lakituTower_lvl6:
            return new StandardAnimationSet(initialAnimation,"Animations/Towers/LakituTowerAS.xml","Game Objects/Towers/lakituTower.png",animType - lakituTower_lvl1);
				
			break;

		}

		return NULL;
	}
}